home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Source / MacTech® Magazine / Volume 09 - 1993 / 09.06 Jun 93 / Dragging Lists / TestDrag.p < prev    next >
Encoding:
Text File  |  1993-05-04  |  4.6 KB  |  213 lines  |  [TEXT/MPS ]

  1. PROGRAM TestDrag;
  2. USES
  3.     MemTypes, QuickDraw, OSIntf, ToolIntf, PackIntf,
  4.     LtoLDragUnit;
  5.     
  6. CONST
  7.     kDialogID    =    128;
  8.     B_OK        =    1;
  9.     kReturn        =    13;
  10.     kEnter         =    3;
  11.     kInvalidDrag=    $8000;
  12.     
  13. VAR
  14.     gDragDialog            : DialogPtr;
  15.     ExitDialog            : BOOLEAN;
  16.  
  17. {------------------------------------------------}
  18.  
  19. FUNCTION FindCell(VAR Selected_Cell : Point;
  20.     TheList : ListHandle) : BOOLEAN; 
  21. BEGIN
  22.     SetPt(Selected_Cell, 0, 0);
  23.     FindCell:= LGetSelect(TRUE, Selected_Cell,
  24.         TheList);
  25. END;     
  26.  
  27. {------------------------------------------------}
  28.  
  29. PROCEDURE AddListString(theString:Str255; VAR
  30.                     theList:ListHandle; AddWhere : Integer); 
  31. {This is a routine used to add strings to an }
  32. {existing list} 
  33. VAR 
  34.     cSize             : Point;
  35.     Whichcell    : Point;
  36. BEGIN 
  37.     IF (theList <> NIL) THEN 
  38.     BEGIN 
  39.         cSize.h := 0; 
  40.         cSize.v := LAddRow(1, AddWhere, theList);
  41.         LSetCell(@TheString[1], length(TheString),
  42.             cSize,theList);
  43.         LDraw(cSize, theList);    {Draw the new string}
  44.     END;
  45. END; 
  46.     
  47. {------------------------------------------------}
  48.  
  49. PROCEDURE DrawList (TheWindow : WindowPtr;
  50.                                                 TheItem : Integer);
  51. {Draw/Update the list which is connected to the useritem TheItem} 
  52. VAR
  53.     TempRect : Rect;
  54.     DType         : Integer;
  55.     DItem         : Handle;
  56. BEGIN
  57.     IF gDragDialog = NIL THEN EXIT(DrawList);
  58.     GetDItem(gDragDialog,TheItem,DType,DItem,
  59.                         tempRect);
  60.     InsetRect(TempRect, -1, -1);
  61.     FrameRect(TempRect);
  62.     CASE TheItem OF
  63.         U_List1:LUpdate(gDragDialog^.VisRgn, gList1);
  64.         U_List2:LUpdate(gDragDialog^.VisRgn, gList2);
  65.         U_List3:LUpdate(gDragDialog^.VisRgn, gList3);
  66.     END;
  67. END;
  68.  
  69. {------------------------------------------------}
  70.  
  71. PROCEDURE MakeList (WhichList : Integer; VAR
  72.                                                  ListVar : ListHandle);
  73. VAR
  74.     DType        : Integer;
  75.     DItem        : Handle;
  76.     RView, DBounds    : Rect;
  77.     CSize         : Point;
  78. BEGIN
  79.     GetDItem (gDragDialog, WhichList, DType, DItem,
  80.                          RView);
  81.     SetRect(DBounds, 0, 0, 1, 0);
  82.     SetPt(CSize, RView.Right - RView.Left, 16);
  83.     ListVar := LNew (RView, DBounds, CSize, 0,
  84.         gDragDialog, TRUE, FALSE, FALSE, TRUE);
  85.     ListVar^^.lClikLoop := ProcPtr(@LtoLClickProc);
  86.     ListVar^^.RefCon := WhichList;
  87.     SetDItem(gDragDialog, WhichList, DType,
  88.                         Handle(@DrawList), RView);
  89. END;
  90.  
  91. {------------------------------------------------}
  92.  
  93. FUNCTION DetectListClick (VAR TheList :
  94.     ListHandle; TheEvent : EventRecord) : BOOLEAN;
  95. {Detect clicks in a list}
  96. VAR
  97.     MyPt : Point;
  98. BEGIN
  99.     DetectListClick := FALSE;
  100.     IF TheList=NIL THEN EXIT(DetectListClick);
  101.     MyPt := theEvent.where;
  102.     GlobalToLocal(MyPt);
  103.     DetectListClick := LClick(myPt,
  104.         theEvent.modifiers, TheList);
  105. END;    {procedure}
  106.  
  107. {------------------------------------------------}
  108.  
  109. FUNCTION MyFilter (theDialog : DialogPtr; VAR
  110.     theEvent : EventRecord; VAR itemHit : integer) :
  111.     BOOLEAN;
  112. {catch clicks in the lists or 'ok' equivalents}
  113. VAR
  114.     chCode : Integer;
  115. BEGIN
  116.     MyFilter := FALSE;
  117.     CASE theEvent.what OF
  118.       KeyDown, AutoKey :
  119.         WITH theEvent DO
  120.         BEGIN
  121.             chCode := BitAnd(message, CharCodeMask);
  122.             IF (chCode = kEnter) | (chCode = kReturn)
  123.             THEN
  124.               ExitDialog := TRUE;
  125.         END;    {with}
  126.     MouseDown :
  127.         MyFilter:=DetectListClick(gList1,TheEvent) |
  128.                              DetectListClick(gList2,TheEvent) |
  129.                              DetectListClick(gList3,TheEvent);
  130.     END;    {case}
  131. END;    {MyFilter}
  132.  
  133. {------------------------------------------------}
  134.  
  135. PROCEDURE DoDragDialog;
  136. VAR
  137.     TempRect    : Rect;
  138.     SavePort    : GrafPtr;
  139.     ItemHit    : Integer;
  140.     i                 : Integer;
  141.     
  142.     FUNCTION ToStr (tempint : LongInt) : Str255;
  143.     VAR
  144.         Tempstr : Str255;
  145.     BEGIN
  146.         NumToString(tempint, tempstr);
  147.         ToStr := tempstr;
  148.     END;
  149.     
  150. BEGIN
  151.     ExitDialog := FALSE;
  152.     SetRect (TempRect, 100, 100, 400, 400);
  153.     gDragDialog := GetNewDialog (kDialogID, NIL,
  154.         WindowPtr(-1));
  155.     IF gDragDialog=NIL THEN EXIT (DoDragDialog);
  156.     GetPort(SavePort);
  157.     SetPort(gDragDialog);
  158.     MakeList (U_List1, gList1);
  159.     MakeList (U_List2, gList2);
  160.     MakeList (U_List3, gList3);
  161.     LDoDraw(FALSE, gList1);
  162.     LDoDraw(FALSE, gList2);
  163.     LDoDraw(FALSE, gList3);
  164.     FOR i := 1 to 20 DO
  165.     BEGIN
  166.         AddListString(Concat('List 1, # ',ToStr(i)),
  167.                                         gList1, i);
  168.         AddListString(Concat('List 2, # ',ToStr(i)),
  169.                                         gList2, i);
  170.         AddListString(Concat('List 3, # ',ToStr(i)),
  171.                                         gList3, i);
  172.     END;
  173.     LDoDraw(TRUE, gList1);
  174.     LDoDraw(TRUE, gList2);
  175.     LDoDraw(TRUE, gList3);
  176.     SetDragEnvironment (gDragDialog);
  177.  
  178.     REPEAT
  179.         ModalDialog(@MyFilter, itemHit);
  180.         IF ItemHit = B_OK THEN ExitDialog := TRUE;
  181.     UNTIL ExitDialog;
  182.     
  183.     LDispose(gList1);
  184.     LDispose(gList2);
  185.     LDispose(gList3);
  186.     DisposDialog(gDragDialog);
  187.     SetPort(SavePort);
  188. END;
  189.  
  190. {------------------------------------------------}
  191.  
  192. PROCEDURE Initialize;
  193. BEGIN
  194.     InitGraf(@thePort);
  195.     InitFonts;
  196.     InitWindows;
  197.     InitMenus;
  198.     TEInit;
  199.     InitDialogs(NIL);
  200.     InitCursor;
  201.     InitLtoLDrag;
  202.     Flushevents(everyevent, 0);
  203.     gDragDialog := NIL;
  204. END;
  205.     
  206. BEGIN
  207.     Initialize;
  208.     DoDragDialog;
  209. END.
  210.  
  211.  
  212.  
  213.